﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Datos; 

namespace Negocio
{
    public class catalogoCalendarioAcademico
    {
        ControlAsistenciaEntities _objEntity = new ControlAsistenciaEntities();
        
        ///// <summary>
        ///// Devuelve una lista con los valores de los eventos del calendario
        ///// </summary>
        ///// <returns>los ventos todos del calendario</returns>
        //public List<calendarioAcademico> obtenerCalendarioAcademico ()
        //{
        //    List<calendarioAcademico> _listaCalendario = new List<calendarioAcademico>();

        //    try
        //    {
        //        foreach (var item in _objEntity.procObtenerCalendarioAcademico())
        //        {
        //            _listaCalendario.Add(new calendarioAcademico(item.idCalendarioAcademico, item.detalle, item.fechaInicio, item.fechaFin, item.backGroundColor, item.borderColor, item.idPeriodo));
        //        }
        //    }
        //    catch (Exception e)
        //    {
        //        throw e;
        //    }
        //    return _listaCalendario;
        //}

        /// <summary>
        /// devuelve una lista con los valores de los eventos unicamente por el periodo
        /// </summary>
        /// <returns>devuelve todos los eventos del calendario por periodo</returns>
        public List<calendarioAcademico> obtenerCalendarioAcademicoxPeriodo(int _idPeriodo)
        {
            List<calendarioAcademico> _listaCalendario = new List<calendarioAcademico>();

            try
            {
                foreach (var item in _objEntity.procObtenerCalendarioAcademico(_idPeriodo))
                {
                    _listaCalendario.Add(new calendarioAcademico(item.idCalendarioAcademico, item.detalle, item.fechaInicio, item.fechaFin, item.backGroundColor, item.borderColor, item.idPeriodo,(bool)item.asistencia));
                }

                return _listaCalendario;
            }
            catch (Exception)
            {
                return _listaCalendario;
            }            
        }

        /// <summary>
        /// devuelve una lista con los valores de los eventos unicamente por el periodo Y EL MES
        /// </summary>
        /// <returns>devuelve todos los eventos del calendario por periodo</returns>
        public List<calendarioAcademico> obtenerCalendarioAcademicoxPeriodoANdMEs(int _idPeriodo, DateTime _fechaMes)
        {
            List<calendarioAcademico> _listaCalendario = new List<calendarioAcademico>();

            try
            {
                foreach (var item in _objEntity.procObtenerCalendarioAcademicoXMes(_idPeriodo, _fechaMes))
                {
                    _listaCalendario.Add(new calendarioAcademico(item.idCalendarioAcademico, item.detalle, item.fechaInicio, item.fechaFin, item.backGroundColor, item.borderColor, item.idPeriodo, (bool)item.asistencia));
                }

                return _listaCalendario.OrderBy(E =>E.start).ToList();
            }
            catch (Exception)
            {
                return _listaCalendario;
            }
        }
        /// <summary>
        /// Permite agregar un nuevo evento al calendario
        /// </summary>
        /// <param name="cAcademico"></param>
        /// <returns></returns>
        public bool agregarEventoCalendario(calendarioAcademico cAcademico)
        {
            try
            {
                _objEntity.procAgregarCalendarioAcademico(cAcademico.title, Convert.ToDateTime( cAcademico.start), Convert.ToDateTime( cAcademico.end), cAcademico.backgroundColor, cAcademico.borderColor, cAcademico.idPeriodo,cAcademico.asistencia);
                return true;
            }
            catch (Exception)
            {
                return false;
            }
            
        }
        /// <summary>
        /// Permite eliminar un evento del calendario
        /// </summary>
        /// <param name="_idCalendarioAcademico"></param>
        public void eliminarEventoCalendario(int _idCalendarioAcademico)
        {
            try
            {
                _objEntity.procEliminarEventoCalendario(_idCalendarioAcademico);
            }
            catch (Exception e)
            {
                
                throw e;
            }
        }
        /// <summary>
        /// Permite editar un evento de los q se encuentra en el calendario
        /// </summary>
        /// <param name="_cAcademico"></param>
        /// <returns></returns>
        public bool editarEventoCalendario(calendarioAcademico _cAcademico)
        {
            try
            {
                _objEntity.procModicarEventoCalendario(_cAcademico.id, _cAcademico.title, _cAcademico.start, _cAcademico.end, _cAcademico.backgroundColor, _cAcademico.borderColor,_cAcademico.asistencia);
                return true;
            }
            catch (Exception)
            {

                throw;
            }
        }
        /// <summary>
        /// Obtener inicio y fin de clases por medio del codigo de color del evento
        /// </summary>
        /// <param name="_idPeriodo">Periodo Actual</param>
        /// <param name="_color">Codigo de color del evento</param>
        /// <returns>Objeto de Calendario</returns>
        public calendarioAcademico obtenerInicioANDFinDeClases(int _idPeriodo, string _color)
        {
            calendarioAcademico _objFecha = null;
            try
            {
                var resultFecha = _objEntity.procObtenerCalendarioAcademicoInicioANDFinDeClasesXIdPeriodo(_idPeriodo, _color).First();
                _objFecha = new calendarioAcademico(resultFecha.idCalendarioAcademico, resultFecha.detalle, resultFecha.fechaInicio, resultFecha.fechaFin, resultFecha.backGroundColor, resultFecha.borderColor, resultFecha.idPeriodo);
                return _objFecha;
            }
            catch (Exception)
            {
                return _objFecha;
            }
        }
        /// <summary>
        /// obtienes las fechas de los periodos de la matriculas
        /// </summary>
        /// <returns></returns>
        public List<calendarioAcademico> obtenerFechasMatriculas(int _idPeriodo)
        {
            List<calendarioAcademico> _lista = new List<calendarioAcademico>();
            try
            {
                var fechas = _objEntity.procConsultarFechasdeMatriculas(_idPeriodo).ToList();
                foreach (var item in fechas)
                {
                    _lista.Add(new calendarioAcademico { id=(int)item.idPeriodo, start=item.fechaInicio,end=item.fechaFin, title=item.detalle}); 
                }
                return _lista;
            }
            catch (Exception)
            {
                return _lista;
            }
        }


        /// <summary>
        /// Obtiene registro del calendario 
        /// </summary>
        /// <param name="_idPeriodo">Periodo Academico</param>
       
        /// <returns></returns>
        public calendarioAcademico obtenerFechadelCalendarioComprobacionAsistencia(int _idPeriodo, DateTime _fecha)
        {
            calendarioAcademico _objFecha = null;
            try
            {
                var resultFecha = _objEntity.procObtenerCalendarioAcademicoXfecha(_idPeriodo, _fecha).First();
                _objFecha = new calendarioAcademico(resultFecha.idCalendarioAcademico, resultFecha.detalle, resultFecha.fechaInicio, resultFecha.fechaFin, resultFecha.backGroundColor, resultFecha.borderColor, resultFecha.idPeriodo, (bool)resultFecha.asistencia);
                return _objFecha;
            }
            catch (Exception)
            {
                return _objFecha;
            }
        }
    }
}
